/**********************************************************************************\
** 文件名称: 1302.c
** 创建人员: YCG
** 创建日期: 2018-11-20
** 文档描述:
** 版本代号: V0.1
** 版本说明: 初始版本
\********************************************************************************/
#include "1302.h"

/*******************************************************************************
** 函数名称: DsInit
** 功能描述:
** 参数说明: None
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-11-20
********************************************************************************/
void DsInit(void) {
    P3M1 &= ~B0000_1000;
    P3M0 &= ~B0000_1000;  //clk设置为强输出

    P3M1 &= ~B0000_0010;
    P3M0 &= ~B0000_0010;  //SDA设置为准双向口

    P5M1 &= ~B0010_0000;
    P5M0 &= ~B0010_0000;  //rst设置为强输出
    DS_RST = 0;
    DS_CLK = 0;
    DS_SDA = 0;
}

/*******************************************************************************
** 函数名称: DsSetReg
** 功能描述:
** 参数说明: add: [输入]   地址
**			     dat: [输入/出]数据
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-11-20
********************************************************************************/
void DsSetReg(u8 add, u8 dat)
{
    u8 i;
    DS_RST = 1;			 //把复位线拿高
    for(i = 0; i < 8; i++)
    {   //低位在前
        DS_CLK = 0;		 //时钟线拿低开始写数据
        DS_SDA = add & 0x01;
        add >>= 1;		 //把地址右移一位
        DS_CLK = 1;		 //时钟线拿高
    }
    for(i = 0; i < 8; i++)
    {
        DS_CLK = 0;		 //时钟线拿低开始写数据
        DS_SDA = dat & 0x01;
        dat >>= 1;		 //把数据右移一位
        DS_CLK = 1;		 //时钟线拿高
    }
    DS_RST = 0;			 //复位线合低
    DS_CLK = 0;
    DS_SDA = 0;
}

/*******************************************************************************
** 函数名称: DsReadReg
** 功能描述: 读取寄存器的值
** 参数说明: add: [输入]  地址
** 返回说明: 数据
** 创建人员: YCG
** 创建日期: 2018-11-20
********************************************************************************/
u8 DsReadReg(u8 add)
{
    u8 value, i;
    DS_RST = 1;			 //把复位线拿高
    add |= B0000_0001; //最低位置1表示读
    for(i = 0; i < 8; i++)
    {   //低位在前
        DS_CLK = 0;		 //时钟线拿低开始写数据
        DS_SDA = add & 0x01;
        add >>= 1;		 //把地址右移一位
        DS_CLK = 1;		 //时钟线拿高
    }
    for(i = 0; i < 8; i++)
    {
        DS_CLK = 0;		 //时钟线拿低开始读数据
        value >>= 1;
        if(DS_SDA == 1)
            value |= 0x80;
        DS_CLK = 1;		 //时钟线拿高
    }
    DS_RST = 0;			 //复位线合低
    DS_CLK = 0;
    DS_SDA = 0;
    return value;		 //返回读出来的数据
}

/*******************************************************************************
** 函数名称: DsSetTime
** 功能描述:
** 参数说明: reg: [输入] 设置的时间
**			 num: [输入] 数值
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-11-20
********************************************************************************/
void DsSetTime(u8 reg, u8 dat) {
    if(reg == SEC || reg == HOUR) dat &= ~B1000_0000; //确保时钟不暂停，并且24H模式
    DsSetReg(DS_WE, DS_ENABLE);    //打开写保护
	
    DsSetReg(reg, dat);            //写入数据
	
    DsSetReg(DS_WE, DS_DISENABLE); //光闭写保护
}

/********************************End of File************************************/
